package mobi.richaze.llbag.domain.model.cart;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;

import mobi.richaze.llbag.common.util.PaginatedArrayList;
import mobi.richaze.llbag.common.util.PaginatedList;
import mobi.richaze.llbag.domain.model.product.Item;

@SuppressWarnings("serial")
public class Cart implements Serializable {

	private final Map itemMap = Collections.synchronizedMap(new HashMap());
	private final PaginatedList itemList = new PaginatedArrayList(4);

	public Iterator getCartItems() {
		return itemList.iterator();
	}

	public PaginatedList getCartItemList() {
		return itemList;
	}

	public int getNumberOfItems() {
		return itemList.size();
	}

	public Iterator<CartItem> getAllCartItems() {
		List<CartItem> allItems = new ArrayList<CartItem>();
		itemList.gotoPage(0);
		allItems.addAll(itemList);
		while (itemList.nextPage()) {
			allItems.addAll(itemList);
		}
		return allItems.iterator();
	}

	public boolean containsItemId(String itemId) {
		return itemMap.containsKey(itemId);
	}

	public void addItem(Item item, boolean isInStock) {
		CartItem cartItem = (CartItem) itemMap.get(item.getItemId());
		if (cartItem == null) {
			cartItem = new CartItem();
			cartItem.setItem(item);
			cartItem.setQuantity(0);
			cartItem.setInStock(isInStock);
			itemMap.put(item.getItemId(), cartItem);
			itemList.add(cartItem);
		}
		cartItem.incrementQuantity();
	}

	public Item removeItemById(String itemId) {
		CartItem cartItem = (CartItem) itemMap.remove(itemId);
		if (cartItem == null) {
			return null;
		} else {
			itemList.remove(cartItem);
			return cartItem.getItem();
		}
	}

	public void incrementQuantityByItemId(String itemId) {
		CartItem cartItem = (CartItem) itemMap.get(itemId);
		cartItem.incrementQuantity();
	}

	public void setQuantityByItemId(String itemId, int quantity) {
		CartItem cartItem = (CartItem) itemMap.get(itemId);
		cartItem.setQuantity(quantity);
	}

	public BigDecimal getSubTotal() {
		BigDecimal subTotal = new BigDecimal("0");
		Iterator items = getAllCartItems();
		while (items.hasNext()) {
			CartItem cartItem = (CartItem) items.next();
			Item item = cartItem.getItem();
			BigDecimal listPrice = item.getListPrice();
			BigDecimal quantity = new BigDecimal(String.valueOf(cartItem
					.getQuantity()));
			subTotal = subTotal.add(listPrice.multiply(quantity));
		}
		return subTotal;
	}

}
